home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / COUPON.TST / CPNCHISQ.C < prev    next >
C/C++ Source or Header  |  1995-12-07  |  3KB  |  107 lines

  1. /* ============ */
  2. /* cpnchisq.c    */
  3. /* ============ */
  4. #include <defcodes.h>
  5. #include <miscdefs.h>
  6. #include <cupndefs.h>
  7. #include <assert.h>
  8.  
  9. static long CouponCtrs[MAX_COUPON_LEN];
  10. /* ==================================================================== */
  11. /* CollectCouponSet - Collects Complete Set of Coupons            */
  12. /* ==================================================================== */
  13. static void
  14. CollectCouponSet(COUPON_DATA_STRU * CouponData)
  15. {
  16.     int     CouponCt = 0, SegSize;
  17.  
  18.     /* -------------------------------------- */
  19.     /* Clear Coupon Counters & Variate Counts */
  20.     /* -------------------------------------- */
  21.     memset(CouponCtrs, 0, sizeof(CouponCtrs));
  22.     CouponData->TotNumGen    = 0;
  23.     CouponData->ActMaxPerSeg = 0;
  24.  
  25.     do
  26.     {
  27.     /* ------------------- */
  28.     /* Generate New Coupon */
  29.     /* ------------------- */
  30.     SegSize = GenCouponData(CouponData);
  31.  
  32.     /* ---------------------------------- */
  33.     /* Record Actual Maximum Segment Size */
  34.     /* ---------------------------------- */
  35.     if (SegSize > CouponData->ActMaxPerSeg)
  36.     {
  37.         CouponData->ActMaxPerSeg = SegSize;
  38.     }
  39.  
  40.     /* ------------------------------ */
  41.     /* Bump Number Variates Generated */
  42.     /* ------------------------------ */
  43.     CouponData->TotNumGen += SegSize;
  44.  
  45.     if (!CouponData->CallStatusOK)
  46.     {
  47.         break;
  48.     }
  49.  
  50.     /* -------------------------------- */
  51.     /* Lump Count of Segments > Maximum */
  52.     /* -------------------------------- */
  53.     if (SegSize > CouponData->MaxCpnLen)
  54.     {
  55.         SegSize = CouponData->MaxCpnLen;
  56.     }
  57.     assert(SegSize - CouponData->SetSize < MAX_COUPON_LEN);
  58.  
  59.     ++CouponCtrs[SegSize - CouponData->SetSize];
  60.     ++CouponCt;
  61.     }
  62.     while (CouponCt < CouponData->NumCoupons);
  63. }
  64. /* ======================================================================= */
  65. /* CalcCouponChiSq - Gets Chi-Square Statistic for Coupon Collector's Test */
  66. /* ======================================================================= */
  67. void
  68. CalcCouponChiSq(COUPON_DATA_STRU * CouponData)
  69. {
  70.     CollectCouponSet(CouponData);
  71.  
  72.     if (CouponData->CallStatusOK)
  73.     {
  74.     int    j;
  75.  
  76.     /* --------------------------- */
  77.     /* Lump Categories as Required */
  78.     /* --------------------------- */
  79.     for (j = 0; j < CouponData->NotEnough; ++j)
  80.     {
  81.         CouponCtrs[j + 1] += CouponCtrs[j];
  82.     }
  83.  
  84.     /* ------------------------------ */
  85.     /* Calculate Chi-Square Statistic */
  86.     /* ------------------------------ */
  87.     CouponData->CouponChiSq = 0;
  88.  
  89.     for (j = CouponData->NotEnough; j < CouponData->NumCategories; ++j)
  90.     {
  91.         if (CouponCtrs[j])
  92.         {
  93.         CouponData->CouponChiSq +=
  94.             SQR((double) CouponCtrs[j]) / CouponData->CellExpect[j];
  95.         }
  96.         P(printf("\tCouponCtrs[%2d] = %ld\tCouponChiSq = %.15e\n",
  97.         j, CouponCtrs[j], CouponData->CouponChiSq));
  98.     }
  99.  
  100.     CouponData->CouponChiSq -= CouponData->NumCoupons;
  101.     }
  102.     else
  103.     {
  104.     printf("Chi-Square Process Failed\n");
  105.     }
  106. }
  107.